<?php
define('HOST', 'localhost');
define('USER', 'root');
define('PASSWD', '');
define('PORT', '3306');
define('DB', 'vmetro');

## 定义服务器上写入文件系统的编码
define('SERVER_FS_CHARSET', 'gb2312');

##用于启动session，在以后的代码里无需显示启动session
session_start();

//检查有没有需要的参数
function request_params_exist($param_names) {
    foreach ($param_names as $name) {
        if (!isset($_POST[$name]) && !isset($_GET[$name])) {
            return false;
        }
    }
    return true;
}

//连接数据库
function db_connect() {
    $conn = @mysqli_connect(HOST, USER, PASSWD, DB, PORT) or die_db_link();
    $charset = 'utf8';
    mysqli_set_charset($conn, $charset) or die_db_error($conn, '字符集' . $charset . '设置失败');
    return $conn;
}

function die_db_error($conn) {
    $args = func_get_args();
    $num = count($args);
    $msg = mysqli_error($conn);
    if ($num > 1) {
        $msg = $args[1];
    }
    mysqli_close($conn);
    die(ret_error_json($msg));
}

function die_db_link() {
    $args = func_get_args();
    $num = count($args);
    $msg = $num === 0 ? '数据库连接失败' : $args[0];
    die(ret_error_json($msg));
}

// 用于其他情况的die
function die_error($message = '错误') {
    die(ret_error_json($message));
}

function die_fail($message = '失败') {
    die(ret_fail_json($message));
}

// 返回不同值的map
function ret_ok($data = null, $message = 'ok') {
    return array('status' => 'ok', 'message' => $message, 'data' => $data);
}

function ret_fail($message = 'fail') {
    return array('status' => 'fail', 'message' => $message, 'data' => null);
}

function ret_error($message = 'error') {
    return array('status' => 'error', 'message' => $message, 'data' => null);
}

// 返回不同值的json
function ret_ok_json($data = null, $message = 'ok') {
    return json_encode(ret_ok($data, $message), JSON_UNESCAPED_UNICODE);
}

function ret_fail_json($message = 'fail') {
    return json_encode(ret_fail($message), JSON_UNESCAPED_UNICODE);
}

function ret_error_json($message = 'error') {
    return json_encode(ret_error($message), JSON_UNESCAPED_UNICODE);
}

#######################################################################
define('USER_LOGGED', 'user');

// 检查是否登录
function is_logged() {
    return isset($_SESSION[USER_LOGGED]);
}

// 登录
function login($username, $passwd, $table = 'user') {
    if ($username === null || $username == '' || $passwd == null || $passwd == '') {
        return ret_error('未传入用户名或者密码');
    }

    // 检查数据库
    $username1 = addslashes($username); // 原来的用户名存session中
    $passwd1 = md5($passwd);
    $conn = db_connect();
    $result = mysqli_query($conn, "select * from $table where username='$username1' and passwd='$passwd1'") or die_db_error($conn);
    $recs = mysqli_fetch_assoc($result);
    $count = count($recs);
    if ($count === 0) {
        die_fail('用户名不存在或者密码错误');
    }
    mysqli_close($conn);

    $_SESSION[USER_LOGGED] = array('id' => $recs['id'], 'username' => $recs['username']);
}

// 获取登录的用户名
function get_logged_username() {
    if (!is_logged()) {
        die_fail('未登录');
    }

    return $_SESSION[USER_LOGGED]['username'];
}

// 注销
function logout() {
    if (!is_logged()) {
        die_fail('并未登录');
    }
    unset($_SESSION[USER_LOGGED]);
}

//显示错误页面
function show_error_page() {
    echo '<!DOCTYPE html>';
    echo '<html lang="zh-CN">';
    echo '<head lang="en">';
    echo '<meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面，任何其他内容都*必须*跟随其后！ -->
    <title>Error!</title>
    <link rel="stylesheet" href="js/jquery/jquery.mobile-1.4.5.min.css"/>
    <link href="css/error.css" rel="stylesheet">
    </head>';
    echo '<body>
      <h2 class="font">您还未登录！</h2>
      <a href="login.php"><button type="button" class="btn">返回登录</button></a>
      <script src="js/jquery/jquery-1.12.0.min.js"></script>
        <script src="js/jquery/jquery.mobile-1.4.5.min.js"></script>
      </body>';
    echo '</html>';
}

#############################注册时##########################################
//判断用户名

function check_username($username) {

    $strlen = strlen($username);
    //两个字符以上，只能有中文，字母，数字，下划线
    if (!preg_match("/^[a-zA-Z0-9_\x7f-\xff]+$/", $username)) {
        die_error('请输入正确格式的用户名');
    } else if (20 < $strlen || $strlen < 2) {
        die_error('用户名长度为2-20之间');
    }
    $conn = db_connect();
    $sql = "select * from user where username='$username'";
    $result = mysqli_query($conn, $sql) or die_db_error($conn);
    $num = mysqli_num_rows($result);
    if ($num != 0) {
        die_error('该用户名已注册过');
    }
}
//判断密码
function check_passwd($passwd) {

    $strlen = strlen($passwd);
    //两个字符以上，只能有中文，字母，数字，下划线
    if (!preg_match("/^[A-Za-z0-9_]/", $passwd)) {
        die_error('密码只能有大小写字母、数字和下划线组成');
    } else if (20 < $strlen || $strlen < 6) {
        die_error('密码长度在6—20之间');
    }
}

//判断手机号
function check_phone($phone) {
    if (!preg_match("/^1[34578]\d{9}$/", $phone)) {
        die_error('手机号输入有误，请输入正确格式手机号');
    }
}

//判断两次密码是否相同
function check_pawd_isame($passwdone, $passwdtwo) {
    //$char_ret = "两次密码相同";
    if ($passwdone != $passwdtwo) {
        die_error('两次输入密码不一致');
    }
}

//修改用户名和个性签名
function personal_change($username,$text){
    $conn=  db_connect();
    $sql="select '$username' from user";
    $result=  mysqli_query($conn, $sql) or die_db_error($conn);
    if(!result){
        $sql1="update vemtro set username='$username'";
        $result1=  mysqli_query($conn, $sql1);
    }
    else{
        die_error('该用户名已被占用');
    }
    $sql2="update vemtro set signature='$text'";
    $result2=  mysqli_query($conn, $sql2);
}

//往数据库添加用户
function create($username, $passwd, $phone) {
    $conn = db_connect();
    $sql1 = "select * from user";
    $result = mysqli_query($conn, $sql1) or die_db_error($conn);
    $num = mysqli_num_rows($result);
    $sql = "insert into user (id,username,passwd,phone,experience,signature) values ($num+1,'$username',md5('$passwd'),'$phone',0,'happy everyday')";
    if (!mysqli_query($conn, $sql)) {
        die_error('插入数据有误' . mysql_error());
    }
    mysqli_close($conn);
}

# 上传文件，合并php中原来的一些操作
// upfile：form中的文件name，filetype：允许的文件类型，为空表示无限制，path为复制到的目录，name_prefix为新文件名的前缀

function upload_file($upfile, $path, $name_prefix = '', $filetype = null, $server_charset = SERVER_FS_CHARSET) {
    if (empty($upfile) || empty($path)) {
        die_error('参数错误，必须有upfile和path');
    }

    // 判断文件上传时的name
    if (!isset($_FILES[$upfile])) {
        die_error('文件上传name错误');
    }

    if ($_FILES[$upfile]['error'] > 0) {
        die_error('文件上传错误');
    }

    // 判断文件类型
    if (isset($filetype) && !empty($filetype)) {
        if (!in_array($_FILES[$upfile]['type'], $filetype)) {
            die_error('文件类型不符合');
        }
    }

    // 新的文件名
    $tmp = explode(DIRECTORY_SEPARATOR, $_FILES[$upfile]['tmp_name']);
    $tmp = end($tmp);
    $tmp = explode('.', $tmp)[0];   // 这是临时文件的名字，不包括.tmp

    $filename = empty($name_prefix) ? $tmp : $name_prefix . '-' . $tmp;
    $filename = $filename . $_FILES[$upfile]['name'];
    $act_filename = iconv('utf-8', $server_charset, $filename);     // 这是实际写入文件系统的名称，这个跟apache的设置有关，先这么搞，搞定了apache的编码后再改回来
    // 移动文件
    $filepath = $path;
    if (!empty($path) && !(strrchr($path, '/') == '/')) {
        $filepath.='/';
    }

    if (is_uploaded_file($_FILES[$upfile]['tmp_name'])) {
        if (!move_uploaded_file($_FILES[$upfile]['tmp_name'], get_webroot_path() . $filepath . $act_filename)) {
            die_error('上传文件写入失败');
        }
    } else {
        die_error('可能的文件上传攻击');
    }

    return array('path' => $filepath, 'filename' => $filename);
}

// 接收上传的幻灯片，并保存
function save_image($upfile) {
    if (empty($upfile)) {
        die_error('参数错误');
    }

    $path = 'img/'; // 相对目录
    $up_result = upload_file($upfile, $path, 'image', array('image/jpeg', 'image/jpg', 'image/png'));
    $path = $up_result['path'];
    $filename = $up_result['filename'];

    $conn = db_connect();
    mysqli_query($conn, "insert into image (path,filename) values('$path','$filename')") or die_db_error($conn);
    mysqli_close($conn);
}

// 获取项目的根目录，这个函数在http服务器上运行时有效
function get_webroot_uri() {
    $str = $_SERVER['REQUEST_URI'];
    // 从第一个/开始，到下一个/为止之里面的路径为webroot
    $result = explode('/', $str);
    return count($result) == 2 ? '/' : '/' . $result[1] . '/';
}

// 获得项目的webroot的文件系统目录
function get_webroot_path() {
    $webname = explode('/', get_webroot_uri())[1];
    return $_SERVER['DOCUMENT_ROOT'] . "$webname/";
}

// 获得当前php文件名
function myself() {
    $ori = $_SERVER['PHP_SELF'];
    $arr = explode('/', $ori);
    if (count($arr) < 2) {
        $arr = explode(DIRECTORY_SEPARATOR, $ori);
    }
    if (count($arr) < 2) {
        die_error('路径格式未知');
    }
    return end($arr);
}

// json操作
function to_json($obj) {
    return json_encode($obj, JSON_UNESCAPED_UNICODE);
}

function from_json($json) {
    return json_decode($json, true);
}
